﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TJDevHouse.Starcraft.Game.RaceTypes
{
	public abstract class Race
	{
		/// <summary>
		/// Programmatic type for the race
		/// </summary>
		public enum RaceType
		{
			Terran,
			Protoss,
			Zerg,
			Neutral
		}

		/// <summary>
		/// Name of race, e.g. "Terran", "Zerg", "Protoss"
		/// </summary>
		public string Name
		{
			get
			{
				return GetName();
			}
		}

		/// <summary>
		/// The programmatic type of this race. Useful for comparisons, etc.
		/// </summary>
		public Race.RaceType Type
		{
			get
			{
				return GetRace();
			}
		}

		/// <summary>
		/// The type of worker unit for this race, e.g. Zerg Drone
		/// </summary>
		public UnitType WorkerUnitType
		{
			get
			{
				return GetWorkerUnitType();
			}
		}

		/// <summary>
		/// Which building is this race's main base building, e.g. Zerg Hatchery
		/// </summary>
		public UnitType BaseBuildingUnitType
		{
			get
			{
				return GetBaseBuildingUnitType();
			}
		}

		/// <summary>
		/// Which unit is the vespene geyser extractor? e.g. the Zerg Extractor
		/// </summary>
		public UnitType RefineryUnitType
		{
			get
			{
				return GetRefineryUnitType();
			}
		}

		/// <summary>
		/// The unit type which provides transport for this race. e.g. Shuttle.
		/// </summary>
		public UnitType TransportUnitType
		{
			get
			{
				return GetTransportUnitType();
			}
		}

		/// <summary>
		/// The type of building which provides supply for this race, e.g. Supply Depot
		/// </summary>
		public UnitType SupplyProvider
		{
			get
			{
				return GetSupplyProvider();
			}
		}
		
		abstract public string GetName();
		abstract public Race.RaceType GetRace();
		abstract public UnitType GetWorkerUnitType();
		abstract public UnitType GetBaseBuildingUnitType();
		abstract public UnitType GetRefineryUnitType();
		abstract public UnitType GetTransportUnitType();
		abstract public UnitType GetSupplyProvider();
		abstract public UnitType GetGroundDefenceUnitType();
		abstract public UnitType GetAirDefenceUnitType();

		public override string ToString()
		{
			return Name;
		}
	}
}
